#include "Message.h"

namespace zeroplus::mq
{

    std::string MessageIDGenerator::generate()
    {
        using namespace std::chrono;
        auto now = system_clock::now();
        auto now_c = system_clock::to_time_t(now);
        auto now_ms = duration_cast<milliseconds>(now.time_since_epoch()) % 1000;

        // 将当前时间转换为字符串格式，包含毫秒
        std::stringstream ss;
        ss << std::put_time(std::localtime(&now_c), "%Y%m%d%H%M%S") << std::setfill('0') << std::setw(3) << now_ms.count();

        std::string currentTimestamp = ss.str();

        // 如果当前时间戳与上次相同，增加序列号
        if (currentTimestamp == lastTimestamp)
        {
            sequence.fetch_add(1, std::memory_order_relaxed);
        }
        else
        {
            // 如果时间戳不同，重置序列号，并更新时间戳
            lastTimestamp = currentTimestamp;
            sequence.store(0, std::memory_order_relaxed);
        }

        // 将时间戳和序列号拼接成消息ID
        std::string messageId = currentTimestamp + std::to_string(sequence.load(std::memory_order_relaxed));

        // 确保消息ID长度为32，如果需要，可以填充随机数或特定字符
        if (messageId.length() < 32)
        {
            messageId.append(32 - messageId.length(), 'A'); // 示例：用'A'填充
        }

        return messageId;
    }

    // 初始化静态成员
    std::atomic<uint64_t> MessageIDGenerator::sequence(0);
    std::string MessageIDGenerator::lastTimestamp = "";

}
